home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / qed_397 / sourcen / icon.c < prev    next >
C/C++ Source or Header  |  1996-12-29  |  4KB  |  199 lines

  1. #include "global.h"
  2. #include "rsc.h"
  3. #include "set.h"
  4. #include "windows.h"
  5. #include "icon.h"
  6.  
  7. /*****************************************************************/
  8.  
  9. #define    MAX_TYPE_ANZ    10
  10.  
  11. /* ============================================================== */
  12.  
  13. typedef struct
  14. {
  15.     VOID        (*exist)(WORD obj_nr, SET actions);
  16.     BOOLEAN    (*test)(WORD obj_nr, WORD action);
  17.     WORD        (*edit)(WORD obj_nr, WORD action);
  18.     BOOLEAN    (*drag)(WORD obj_nr, WORD dest_obj);
  19. } ICON_TYPE;
  20.  
  21. typedef ICON_TYPE *TYPEP;
  22.  
  23. typedef struct
  24. {
  25.     WORD    icon;
  26.     WORD    type_id;
  27. } ICON_TO_TYPE;
  28. typedef ICON_TO_TYPE *I2T;
  29.  
  30. LOCAL ICON_TYPE    icon[MAX_TYPE_ANZ];
  31. LOCAL ICON_TO_TYPE    i2t[MAX_ICON_ANZ];
  32. LOCAL WORD        type_anz = 0;
  33.  
  34. /* ============================================================== */
  35.  
  36. LOCAL TYPEP search_type(WORD obj_nr)
  37. {
  38.     WORD    i;
  39.     I2T    ic;
  40.  
  41.     obj_nr &= (~SUB_ICON);
  42.     for (ic=i2t,i=MAX_ICON_ANZ; (--i)>=0; ic++)
  43.         if (ic->icon==obj_nr)
  44.             return(icon+ic->type_id);
  45.     return(NULL);
  46. }
  47.  
  48. WORD all_icons(WORD *c)
  49. {
  50.     I2T    ic;
  51.     WORD    i, anz;
  52.  
  53.     ic = i2t;
  54.     for (i=MAX_ICON_ANZ, anz=0; (--i)>=0; ic++)
  55.         if (ic->icon!=-1)
  56.         {
  57.             *c++ = ic->icon;
  58.             anz++;
  59.         }
  60.     return anz;
  61. }
  62.  
  63. /* <0 : Fehler bei der Ausführung    */
  64. /*    =0 : Nicht möglich                    */
  65. /* >0 : Erfolgreich ausgeführt        */
  66. WORD do_icon(WORD icon, WORD action)
  67. {
  68.     TYPEP    t;
  69.  
  70.     t = search_type(icon);
  71.     if (t!=NULL && (t->test)(icon,action))
  72.         return (t->edit)(icon,action);
  73.     return 0;
  74. }
  75.  
  76. VOID do_all_icon(WORD type_id, WORD action)
  77. {
  78.     I2T    ic;
  79.     WORD    i;
  80.  
  81.     ic = i2t;
  82.     for (i=MAX_ICON_ANZ; (--i)>=0; ic++)
  83.         if (ic->icon!=-1 && (ic->type_id==type_id || type_id==ALL_TYPES))
  84.         {
  85.             do_icon(ic->icon, action);
  86.         }
  87. }
  88.  
  89. BOOLEAN Icon_test(WORD icon, WORD action)
  90. {
  91.     TYPEP    t;
  92.  
  93.     t = search_type(icon);
  94.     if (t!=NULL)
  95.         return (t->test)(icon,action);
  96.     return FALSE;
  97. }
  98.  
  99. WORD Icon_edit(WORD icon, WORD action)
  100. {
  101.     TYPEP    t;
  102.  
  103.     t = search_type(icon);
  104.     if (t!=NULL)
  105.         return (t->edit)(icon,action);
  106.     return 0;
  107. }
  108.  
  109. VOID Icon_exist(WORD icon, SET actions)
  110. {
  111.     TYPEP    t;
  112.  
  113.     t = search_type(icon);
  114.     if (t==NULL || t->exist==NULL)
  115.         setclr(actions);
  116.     else (t->exist)(icon,actions);
  117. }
  118.  
  119. BOOLEAN Icon_drag(WORD dest_obj, WORD src_obj)
  120. {
  121.     TYPEP    t;
  122.  
  123.     t = search_type(dest_obj);                        /* Ziel-Icon */
  124.     if (t==NULL || t->drag==NULL) return FALSE;
  125.     return((t->drag)(dest_obj,src_obj));
  126. }
  127.  
  128. WORD decl_icon_type(BOOLEAN(*test)(WORD,WORD),
  129.                          WORD(*edit)(WORD,WORD),
  130.                          VOID(*exist)(WORD,SET),
  131.                          BOOLEAN(*drag)(WORD,WORD))
  132. {
  133.     TYPEP    t;
  134.  
  135.     if (type_anz==MAX_TYPE_ANZ)
  136.         inote(1,FATALERR,12);
  137.     t = icon+type_anz;
  138.     t->exist    = exist;
  139.     t->test    = test;
  140.     t->edit    = edit;
  141.     t->drag    = drag;
  142.     type_anz++;
  143.     return (type_anz-1);
  144. }
  145.  
  146. BOOLEAN add_icon(WORD type_id, WORD obj_nr)
  147. {
  148.     WORD    i;
  149.     I2T    ic;
  150.  
  151.     ic = i2t;
  152.     for (i=MAX_ICON_ANZ; (--i)>=0; ic++)
  153.         if (ic->icon==-1)
  154.         {
  155.             ic->icon = obj_nr;
  156.             ic->type_id = type_id;
  157.             do_icon(obj_nr,DO_INIT);
  158.             return TRUE;
  159.         }
  160.     return FALSE;
  161. }
  162.  
  163. VOID del_icon(WORD obj_nr)
  164. {
  165.     I2T    ic;
  166.     WORD    i;
  167.  
  168.     ic = i2t;
  169.     for (i=MAX_ICON_ANZ; (--i)>=0; ic++)
  170.         if (ic->icon==obj_nr)
  171.         {
  172.             ic->icon = -1;
  173.             return;
  174.         }
  175.     inote(1,FATALERR,1);
  176. }
  177.  
  178. WORD icon_anz(WORD type_id)
  179. {
  180.     I2T    ic;
  181.     WORD    i, anz;
  182.  
  183.     anz = 0;
  184.     ic = i2t;
  185.     for (i=MAX_ICON_ANZ; (--i)>=0; ic++)
  186.         if (ic->type_id==type_id || type_id==ALL_TYPES)
  187.             anz++;
  188.     return anz;
  189. }
  190.  
  191. VOID init_icon(VOID)
  192. {
  193.     WORD    i;
  194.     I2T    ic = i2t;
  195.  
  196.     for (i=MAX_ICON_ANZ; (--i)>=0; ic++)
  197.         ic->icon = -1;
  198. }
  199.